import math


# （多继承）当一个类有多个父类时，默认使用第一个父类的同名属性和方法
# 子类重写父类同名方法和属性 子类和父类具有同名属性和方法，默认使用子类的同名属性和方法
# 如果先调用了父类的属性和方法，父类属性会覆盖子类属性，故在调用属性前，先调用自己子类的初始化
# 调用父类方法，但是为了保证调用到的也是父类的属性，必须在调用方法前调用父类的初始化
# 多层继承
# super()调用父类方法 一次性调用父类的属性和方法
# 面向对象私有 私有属性、私有方法
class Master(object):
    def __init__(self):
        self.kongfu = '[古法煎饼果子配方]'

    def make_cake(self):
        print(f"运用{self.kongfu}制作煎饼果子")


class School(object):
    def __init__(self):
        self.kongfu = '[新式煎饼果子配方]'

    def make_cake(self):
        print(f"运用{self.kongfu}制作煎饼果子")

        super().__init__()
        super().make_cake()


class Prentice(School):
    def __init__(self):
        self.kongfu = '[独创煎饼果子配方]'

    def make_cake(self):
        self.__init__()
        print(f"运用{self.kongfu}制作煎饼果子")

    def make_master_cake(self):
        Master.__init__(self)
        Master.make_cake(self)

    def make_school_cake(self):
        School.__init__()
        School.make_cake()

    def make_old_cake(self):
        super().__init__()
        super.make_cake()


xiaoming = Prentice()
print(xiaoming.kongfu)
xiaoming.make_cake()


# 定义一个三角形，求三角形的面积和周长（属性是：三边）
# 海伦公式 用于计算给定三遍长的三角形的面积，公式为：面积 = [p(p-a)(p-b)(p-c)]**0.5
class Triangle:
    def __init__(self, a, b, c):
        # 验证是否能构成三角形
        if a + b > c and a + c > b and b + c > a:
            self.a = a
            self.b = b
            self.c = c
        else:
            raise ValueError("给定的三边不能构成一个三角形")

    def perimeter(self):
        # 计算周长
        return self.a + self.b + self.c

    def area(self):
        # 使用海伦公式计算面积
        # 首先计算半周长
        s = self.perimeter() / 2
        # 计算面积
        return math.sqrt(s * (s - self.a) * (s - self.b) * (s - self.c))

    # 示例使用


try:
    triangle = Triangle(3, 4, 5)
    print(f"周长: {triangle.perimeter()}")
    print(f"面积: {triangle.area()}")
except ValueError as e:
    print(e)

# 尝试一个不能构成三角形的例子
try:
    triangle_invalid = Triangle(1, 2, 3)
except ValueError as e:
    print(e)
